/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.DAO;

import com.DAO.ConexaoPostgreSQL.ConnectionFactory;
import com.Model.Campo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Fellipe
 */
public class CampoDAO {

    private Connection con = new ConnectionFactory().getConnection();
    private PreparedStatement pstm;

    public void create(Campo c) {

//        int chaveCampo;
//        int ativo = 1;
//        String dublinCore = null;
//        if (!c.getDublinCore().isEmpty()) {
//            dublinCore = c.getDublinCore();
//        }
//        String marc = null;
//        if (!c.getMarc().isEmpty()) {
//            marc = c.getMarc();
//        }
//        String descricao = null;
//        if (!c.getDescricao().isEmpty()) {
//            descricao = c.getDescricao();
//        }
//        String ajuda = null;
//        if (!c.getAjuda().isEmpty()) {
//            ajuda = c.getAjuda();
//        }
//        String tamanho = null;
//        if (c.getTamanho() != 0) {
//            tamanho = "" + c.getTamanho();
//        }
//        String chaveTipoCampo = null;
//        if (c.getTipoCampo().getChaveTipoCampo() != 0) {
//            chaveTipoCampo = "" + c.getTipoCampo().getChaveTipoCampo();
//        }
//        String titulo = null;
//        if (!c.getTitulo().isEmpty()) {
//            titulo = c.getTitulo();
//        }
//        String chaveAcervoRec = null;


        try {

            String sql = "SELECT MAX(chavecampo) + 1 AS maior FROM campo";
            pstm = con.prepareStatement(sql);
            ResultSet rs = pstm.executeQuery();
            rs.next();
            int chaveCampo = rs.getInt("maior");

            sql = "INSERT INTO campo VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, chaveCampo);
            pstm.setString(2, c.getDublinCore());
            pstm.setString(3, c.getMarc());
            pstm.setString(4, c.getDescricao());
            pstm.setString(5, c.getAjuda());
            pstm.setInt(6, c.getTamanho());
            pstm.setInt(7, c.getTipoCampo().getChaveTipoCampo());
            pstm.setString(8, c.getTitulo());
            if (c.getAcervoRecursivo() == null || c.getAcervoRecursivo().getChaveAcervo() == 0) {
                pstm.setNull(9, java.sql.Types.INTEGER);
            } else {
                pstm.setInt(9, c.getAcervoRecursivo().getChaveAcervo());
            }
            pstm.setInt(10, 1);
            pstm.execute();

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

    }

    public List<Campo> readNomes() {

        List<Campo> listaCampos = new ArrayList<Campo>();

        try {

            String sql = "SELECT * FROM campo WHERE ativo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, 1);
            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {

                Campo c = new Campo();

                c.setTitulo(rs.getString("titulo"));
                c.setChaveCampo(rs.getInt("chavecampo"));

                listaCampos.add(c);

            }

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

        return listaCampos;

    }

    public Campo read(int chave) {

        Campo c = new Campo();

        try {

            String sql = "SELECT * FROM campo WHERE chavecampo = ? AND ativo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, chave);
            pstm.setInt(2, 1);
            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {

                c.setDublinCore(rs.getString("coredublin"));
                c.setMarc(rs.getString("marc"));
                c.setDescricao(rs.getString("descricao"));
                c.setAjuda(rs.getString("ajuda"));
                c.setTamanho(rs.getInt("tamanho"));
                c.setTitulo(rs.getString("titulo"));
                c.setChaveCampo(rs.getInt("chavecampo"));
                c.setChaveAcervo(rs.getInt("chaveacervo"));
                if (rs.getInt("chaveacervo") != 0) {
                    c.setAcervoRecursivo(new AcervoDAO().read(rs.getInt("chaveacervo")));
                }
                c.setTipoCampo(new TipoCampoDAO().readUm(rs.getString("chavetipocampo")));

            }

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

        return c;

    }

    public void update(Campo c) {

        int chaveCampo = c.getChaveCampo();
        int ativo = 1;
        String dublinCore = null;
        if (!c.getDublinCore().isEmpty()) {
            dublinCore = c.getDublinCore();
        }
        String marc = null;
        if (!c.getMarc().isEmpty()) {
            marc = c.getMarc();
        }
        String descricao = null;
        if (!c.getDescricao().isEmpty()) {
            descricao = c.getDescricao();
        }
        String ajuda = null;
        if (!c.getAjuda().isEmpty()) {
            ajuda = c.getAjuda();
        }
        String tamanho = null;
        if (c.getTamanho() != 0) {
            tamanho = "" + c.getTamanho();
        }
        String chaveTipoCampo = null;
        if (c.getTipoCampo().getChaveTipoCampo() != 0) {
            chaveTipoCampo = "" + c.getTipoCampo().getChaveTipoCampo();
        }
        String titulo = null;
        if (!c.getTitulo().isEmpty()) {
            titulo = c.getTitulo();
        }
        String chaveAcervoRec = null;
        if (c.getChaveAcervo() == 0 || c.getChaveAcervo() == null) {
//            Se fizer sem o else ele inclui zero no banco, sabe-se lá o porque
        } else {
            chaveAcervoRec = c.getChaveAcervo().toString();
        }

//        if (c.getAcervoRecursivo().getChaveAcervo() != 0 ) {
//            chaveAcervoRec = "" + c.getAcervoRecursivo().getChaveAcervo();
//        }

        try {

            String sql = "UPDATE campo SET coredublin = ?, marc = ?, descricao = ?, ajuda = ?, tamanho = ?, chavetipocampo = ?, titulo = ?, chaveacervo = ? WHERE chavecampo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setString(1, dublinCore);
            pstm.setString(2, marc);
            pstm.setString(3, descricao);
            pstm.setString(4, ajuda);
            pstm.setString(5, tamanho);
            pstm.setString(6, chaveTipoCampo);
            pstm.setString(7, titulo);
            pstm.setString(8, chaveAcervoRec);
            pstm.setInt(9, chaveCampo);
            pstm.execute();

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

    }

    public void delete(int chaveCampo) {

        try {

            String sql = "UPDATE campo SET ativo = ? WHERE chavecampo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, 0);
            pstm.setInt(2, chaveCampo);
            pstm.execute();

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

    }
}
